/**
 * @file link_queue.h
 * @brief 链队列
 * @author Xavier ZXY (zxy_xavier@163.com)
 * @version : 1.0
 * @date 2022-05-15
 * 
 */

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status; 

typedef int QElemType; /* QElemType类型根据实际情况而定，这里假设为int */

/**
 * @brief 节点结构
 */
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode, *QueuePtr;

/**
 * @brief 队列的链表结构
 */
typedef struct
{
    QueuePtr front, rear;
}LinkQueue;

/* 遍历元素 */
Status visit(QElemType c);

/* 构造一个空队列Q */
Status InitQueue(LinkQueue *Q);

/* 销毁队列Q */
Status DestroyQueue(LinkQueue *Q);

/* 将Q清为空队列 */
Status ClearQueue(LinkQueue *Q);

/* 若Q为空队列,则返回TRUE,否则返回FALSE */
Status QueueEmpty(LinkQueue Q);

/* 求队列的长度 */
int QueueLength(LinkQueue Q);

/* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
Status GetHead(LinkQueue Q,QElemType *e);


/* 插入元素e为Q的新的队尾元素 */
Status EnQueue(LinkQueue *Q,QElemType e);

/* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
Status DeQueue(LinkQueue *Q,QElemType *e);

/* 从队头到队尾依次对队列Q中每个元素输出 */
Status QueueTraverse(LinkQueue Q);